package com.ruoyi.system.service;

import java.util.List;
import com.ruoyi.system.domain.Application;

/**
 * 志愿申请Service接口
 *
 * @author ltr
 * @date 2024-10-23
 */
public interface IApplicationService
{
    /**
     * 查询志愿申请
     *
     * @param applicationId 志愿申请主键
     * @return 志愿申请
     */
    public Application selectApplicationByApplicationId(Long applicationId);

    /**
     * 查询志愿申请列表（管理员使用）
     *
     * @param application 志愿申请
     * @return 志愿申请集合
     */
    public List<Application> selectApplicationList(Application application);

    /**
     * 查询学生的志愿申请列表
     *
     * @param studentId 学生ID
     * @return 志愿申请集合
     */
    public List<Application> selectApplicationListByStudentId(Long studentId);

    /**
     * 查询教师的题目下的申请列表
     *
     * @param teacherId 教师ID
     * @return 志愿申请集合
     */
    public List<Application> selectApplicationListByTeacherId(Long teacherId);

    /**
     * 查询指定题目的申请列表
     *
     * @param topicId 题目ID
     * @return 志愿申请集合
     */
    public List<Application> selectApplicationListByTopicId(Long topicId);

    /**
     * 查询教师已录取的学生列表
     *
     * @param teacherId 教师ID
     * @return 志愿申请集合
     */
    public List<Application> selectAcceptedStudentsByTeacherId(Long teacherId);

    /**
     * 学生申请志愿
     *
     * @param application 志愿申请
     * @return 结果
     */
    public int applyForTopic(Application application);

    /**
     * 学生取消志愿申请
     *
     * @param applicationId 申请ID
     * @param studentId 学生ID
     * @return 结果
     */
    public int cancelApplication(Long applicationId, Long studentId);

    /**
     * 教师录取学生
     *
     * @param applicationId 申请ID
     * @param teacherId 教师ID
     * @param reviewBy 审核人
     * @return 结果
     */
    public int acceptStudent(Long applicationId, Long teacherId, String reviewBy);

    /**
     * 教师拒绝学生
     *
     * @param applicationId 申请ID
     * @param teacherId 教师ID
     * @param reviewReason 拒绝理由
     * @param reviewBy 审核人
     * @return 结果
     */
    public int rejectStudent(Long applicationId, Long teacherId, String reviewReason, String reviewBy);

    /**
     * 批量删除志愿申请（管理员）
     *
     * @param applicationIds 需要删除的志愿申请主键集合
     * @return 结果
     */
    public int deleteApplicationByApplicationIds(Long[] applicationIds);

    /**
     * 删除志愿申请信息（管理员）
     *
     * @param applicationId 志愿申请主键
     * @return 结果
     */
    public int deleteApplicationByApplicationId(Long applicationId);

    /**
     * 检查学生是否可以申请（未被录取且该志愿优先级未满）
     *
     * @param studentId 学生ID
     * @param priority 优先级
     * @return 是否可以申请
     */
    public boolean canStudentApply(Long studentId, Integer priority);

    /**
     * 检查题目是否还有名额
     *
     * @param topicId 题目ID
     * @return 是否有名额
     */
    public boolean isTopicAvailable(Long topicId);

    /**
     * 检查申请是否属于指定学生
     *
     * @param applicationId 申请ID
     * @param studentId 学生ID
     * @return 是否拥有
     */
    public boolean checkApplicationOwner(Long applicationId, Long studentId);

    /**
     * 检查申请是否属于指定教师的题目
     *
     * @param applicationId 申请ID
     * @param teacherId 教师ID
     * @return 是否属于
     */
    public boolean checkApplicationBelongsToTeacher(Long applicationId, Long teacherId);
}